package logic.serial;

import logic.serial.bean.JuegoCTFSerial;
import bean.juego.Juego;
import bean.juego.JuegoCTF;
import java.io.*;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import logic.Buscador;
import util.Converter;
import util.MyCollectionUtils;

public class JuegoSerializer {

    private static final String serFile = "/home/gmarcone/juegos.ser";
    private static final Logger logger =
            Logger.getLogger(JuegoSerializer.class.getName());

    public static void guardarJuegos() {
        try {
            //use buffering
            OutputStream file = new FileOutputStream(serFile);
            OutputStream buffer = new BufferedOutputStream(file);
            ObjectOutput output = new ObjectOutputStream(buffer);
            try {
                output.writeObject(MyCollectionUtils.convertList(Buscador.getListaJuegos(), new Converter<JuegoCTFSerial, Juego>() {

                    @Override
                    public JuegoCTFSerial convert(Juego a) {
                        if (a instanceof JuegoCTF) {
                            return ((JuegoCTF) a).toSerial();
                        } else {
                            logger.log(Level.SEVERE, "Juego desconocido");
                            return null;
                        }
                    }
                }));
            } finally {
                output.close();
            }
        } catch (IOException ex) {
            logger.log(Level.SEVERE, "Cannot perform output.", ex);
        }
    }

    public static void cargarJuegos() {
        try {
            File file = new File(serFile);
            if (file.exists() && file.isFile()) {
                InputStream fileIS = new FileInputStream(file);
                InputStream buffer = new BufferedInputStream(fileIS);
                ObjectInput input = new ObjectInputStream(buffer);
                try {
                    //deserialize the List
                    List<JuegoCTFSerial> serialJuegos = (List<JuegoCTFSerial>) input.readObject();
                    //display its data
                    for (JuegoCTFSerial serialJuego : serialJuegos) {
                        JuegoCTF juego = JuegoCTF.fromSerial(serialJuego);
                        juego.cargarEnSistema();
                    }
                } finally {
                    input.close();
                }
            }
        } catch (ClassNotFoundException ex) {
            logger.log(Level.SEVERE, "Cannot perform input. Class not found.", ex);
        } catch (IOException ex) {
            logger.log(Level.SEVERE, "Cannot perform input.", ex);
        }
    }
}
